/**
 * 原型 一个高大尚的名词
 * 在JS中原型是对象和函数的交互
 * 我对原型的理解,使用函数构造对象
 */
// demo1 普通对象

var person = {
    name: "小明",
    age: 18,
    action: function () {
        console.log("吃")
    }
}
// console.log(person);
// demo2 普通函数
function per(name, age) {
    return {
        name: name,
        age: age,
        action: function () {
            console.log("吃");
        }
    }
}
// console.log(per("小红",20));
// demo1和demo2 有包含关系 但实质上 函数是函数 对象是对象
// 在牛逼点你加个说专业术语 顶多demo2叫做"工厂函数"
// console.log(per("小红",20));
// console.log(per("小青"，999))；

// 以下是原型知识
// 回顾数据类型知识时一直强调函数是对象的一种
// 函数中有一个关键字 this
// this在函数中代表一个函数本身的空对象
// demo3

function demo3() {
    return this;
}
// 直接打印this不空 留待后面讲
// console.log(demo3());
// 原型 demo4
function demo4() {
    return this
}

// console.log((new demo4())); // 结果 demo4{}
// demo4的效果 就是 原型
// 当使用new关键字实例化demo4时
// demo4函数是它内部this这个空对象的原型

// 实例化时 this是一个空对象 那么咱们就可以在制作函数时添加点属性
function person(name, age) {
    this.name = name
    this.age = age
    this.action = function () {
        console.log("吃");
    }
}
// console.log(new person("小白"，1000) )；
// 通过原型 不仅仅是返回一个对象 原型也能够为这个对象设置很多私有的功能方法

// 原型更高级的功能:私有属性

person.prototype.mustAction = function () {
    console.log(this.name + ":吃喝拉撒");
}

console.log(new person("小白", 1000));
// 明面上的对象属性
// { name: '小白', age: 1000, action: [Function (anonymous)] }

var p1 = new person("法海", 90);

// console.log(p1);
// 原型这个概念更多是为原型的私有方法而设计的
// 使用原型主要还是给一个对象添加一些私有方法
p1.mustAction()
person.prototype.beleve = function () {
    if (this.type == 0) {
        return "人皇"
    }
}